package cn.edu.jxau.core.util.mail;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.MessageFormat;
import java.util.Properties;

import javax.mail.Session;

import cn.edu.jxau.core.util.StringUtil;


public class SendEmail {
    private static Properties prop; //配置文件
    private static Session session; //Session : 如果得到了他，表示已经和服务器连接上了，与Connection相似
    private static boolean ssl_enable = true;   //是否开启SSL协议
    
    
    /**
     * 初始化，加载模块文件
     * @zclong
     * @2017年8月3日
     * @ReturnType: void
     * @param emailTemplate 如果为空,默认为email_template.properties在类路径下
     * @throws IOException 
     */
    public static void init(String emailTemplate) throws IOException {
        if(StringUtil.isBlank(emailTemplate)) {
            emailTemplate = "email_template.properties";
        }
        //得到配置文件路径
        URL url = SendEmail.class.getClassLoader().getResource(emailTemplate);

        InputStream in = url.openStream();
        try {
            //加载配置文件
            prop = new Properties();
            prop.load(new InputStreamReader(in, "utf-8"));
            
            String ssl_enableStr = prop.getProperty("ssl_enable");
            //返回是否匹配指定的字符串，如果匹配则为true,否则为false;
            if(StringUtil.matches(ssl_enableStr, "false")) {
                ssl_enable = false;
            }
            
            session = MailUtils.createSession(prop.getProperty("host"), prop.getProperty("uname"),
                    prop.getProperty("pwd"), ssl_enable);    //得到session
        } catch (IOException e) {
            throw e;
        } finally {
            if (null != in)
                in.close();
        }
    }
    
    /**
     * 获取主题
     * @zclong
     * @2017年8月4日
     * @ReturnType: String
     * @param subjectKey
     * @param arguments
     * @return
     */
    public static String getSubject(String subjectKey, Object... arguments) {
        String subject = prop.getProperty(subjectKey);   //获取主题
        subject = MessageFormat.format(subject, arguments); //替换配置文件中的主题参数
        return subject;
    }
    
    /**
     * 获取邮件内容
     * @zclong
     * @2017年8月4日
     * @ReturnType: String
     * @param contentKey
     * @param arguments
     * @return
     */
    public static String getContent(String contentKey, Object... arguments) {
        String content = prop.getProperty(contentKey);  //获取邮件内容
        content = MessageFormat.format(content, arguments); //替换{0},替换配置文件中的邮件内容参数
        return content;
    }
    
    /**
     * 创建邮件对象
     * @zclong
     * @2017年8月4日
     * @ReturnType: Mail
     * @param to 接收方，发送方默认，在配置文件中给出，固定
     * @param subject 邮件主题
     * @param content 邮件内容
     * @return
     */
    public static Mail getMail(String to, String subject, String content) {
        return new Mail(prop.getProperty("from"), to, subject, content);
    }
    
    /**
     * 发送邮件
     * @param mail
     */
    public static void sendMail(final Mail mail) {
        new SendEmailThread(mail).start();
    }

    /**
     * 发送邮件线程
     */
    private static class SendEmailThread extends Thread {
        private final Mail mail;

        private SendEmailThread(final Mail mail) {
            this.mail = mail;
        }

        @Override
        public void run() {
            try {
                MailUtils.send(session, mail);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}
